package studio7Omega.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import studio7Omega.excepcion.DAOExcepcion;
import studio7Omega.modelo.Instrumento;
import studio7Omega.modelo.Sala;
import studio7Omega.modelo.Local;
import studio7Omega.modelo.Servicio;
import studio7Omega.util.ConexionBD;
import studio7Omega.dao.BaseDAO;




public class SalaDAO extends BaseDAO{
	public static void actualizarCosto(int idsala, double costo) throws DAOExcepcion {

        String query = "update sala set costo = ? where idsala = ?";
        Connection con = null;
        PreparedStatement stmt = null;
       //String mensaje="";
        try {
            con = ConexionBD.obtenerConexion();
            stmt = con.prepareStatement(query);
            stmt.setDouble(1, costo);
            stmt.setInt(2, idsala);
            int i = stmt.executeUpdate();
            if (i == 0) {
               // mensaje = "No se pudo actualizar el Costo";
                throw new SQLException("No se pudo actualizar el Costo");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
             try {
                stmt.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println(ex.getMessage());
            }
        }
        //return mensaje;
    }	
	
	public static Collection<Sala> obtenerSalasLocal(int idlocal) throws DAOExcepcion {
        String query = "select idsala, sal.descripcion as nombre,direccion ,lc.descripcion as local, "
                + "capacidad,caracteristicas,costo from sala sal inner join local lc on sal.idlocal = lc.idlocal where lc.idlocal = " + idlocal;

        Collection<Sala> lista = new ArrayList<Sala>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = ConexionBD.obtenerConexion();
            stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Sala vo = new Sala();
                Local va = new Local();
                vo.setIdSala(rs.getInt("idsala"));
                vo.setDescripcion(rs.getString("nombre"));
                va.setDireccion(rs.getString("direccion"));
                va.setDescripcion(rs.getString("local"));
                vo.setCapacidad(rs.getInt("capacidad"));
                vo.setCaracteristicas(rs.getString("caracteristicas"));
                vo.setCosto(rs.getDouble("costo"));

                lista.add(vo);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            try {
                rs.close();
                stmt.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println(ex.getMessage());
            }
        }
        return lista;


    }
	
    public boolean VerificarSala_LocalExistente(String strDescri,int idlocal )
    {
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
            boolean blExiste =false ;
	try {
		
		String query ="select descripcion, idlocal " 
			  +"from sala where descripcion =? and idlocal=?";	
		
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setString(1,strDescri);
		stmt.setInt(2, idlocal);
		rs = stmt.executeQuery();
		if (rs.next()) {
			blExiste =true  ;
		}
                    return blExiste;
	} catch (Exception e) {
                    return false;
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
    }
		
    public Sala insertar(Sala vo) throws DAOExcepcion {
  //  public String insertar(Sala vo) throws DAOExcepcion {
	    //Local lo = new Local();
		System.out.println("SalaDAO: insertar(Sala vo)");
		String query = "INSERT INTO sala(descripcion,capacidad,caracteristicas,costo,idlocal) VALUES (?,?,?,?,?)";
		
        //Verificamos que los datos no existan
        //if(VerificarSala_LocalExistente(vo.getDescripcion(),lo.getIdLocal())==true);
        	
        //{
        //    return "Ya existe el nombre de la sala para ese local " ;
       // }
        
		
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
		//	stmt.setInt(1, vo.getIdSala());
			stmt.setString(1, vo.getDescripcion());
			stmt.setInt(2, vo.getCapacidad());
			stmt.setString(3,vo.getCaracteristicas());
		    stmt.setDouble(4,vo.getCosto());
		    stmt.setInt(5, vo.getLocal().getIdLocal());
		    
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			
		int idp = 0;
		query = "SELECT LAST_INSERT_ID()";
		stmt = con.prepareStatement(query);
		rs = stmt.executeQuery();
		if(rs.next()){
		   idp = rs.getInt(1);
		}	
		vo.setIdSala(idp);	

		
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	public Collection<Sala> buscarSala(String nombre) throws DAOExcepcion {
			System.out.println("SalaDAO: buscarSala(String nombre)");
			//String query = 	"select sal.descripcion as nombre,direccion ,lc.descripcion as local, capacidad,caracteristicas,costo " + 
			//				"from sala sal"+
			//				"inner join local lc on sal.idlocal = lc.idlocal"+
			//				"where sal.descripcion like ? "	;
			
			String query = 	"select  idSala," +
					"sal.descripcion as nombre," +
					"sal.idlocal," +
					"direccion ," +
					"lc.descripcion as local, " +
					"capacidad,caracteristicas," +
					"costo " +
					"from sala sal " +
					"inner join local lc on sal.idlocal = lc.idlocal " +
					"where sal.descripcion like ? ";	
			Collection<Sala> lista = new ArrayList<Sala>();
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, "%" + nombre + "%");
				rs = stmt.executeQuery();
				while (rs.next()) {
					Sala vo = new Sala();
					Local va = new Local();
					
					va.setIdLocal(rs.getInt("idlocal"));
					va.setDescripcion(rs.getString("local"));
					va.setDireccion(rs.getString("direccion"));
					
					vo.setIdSala( rs.getInt("idSala") );
					vo.setDescripcion(rs.getString("nombre"));
					vo.setCapacidad(rs.getInt("capacidad"));
					vo.setCaracteristicas(rs.getString("caracteristicas"));
					vo.setCosto(rs.getDouble("costo"));
					vo.setLocal( va );
						
					lista.add(vo);
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return lista;	
		}
		
	public void armado(Sala objSala) throws DAOExcepcion {
	        System.out.println("RolDAO: armado(Sala objSala)");
	        ArrayList<Instrumento> listaInstrumento = (ArrayList<Instrumento>) objSala.getInstrumento();
	        int contaInstrumentos = 0;

	        //Buscar todos los items que se encuentren usados
	        Connection con = null;
	        PreparedStatement stmt = null;
	        ResultSet rs = null;
	        try {
	            String query = "select iditem from salaitem where idsala = " + objSala.getIdSala();
	            con = ConexionBD.obtenerConexion();
	            Statement st = con.createStatement();
	            rs = st.executeQuery(query);

	            for (int x = 0; x < listaInstrumento.size(); x++) {
	                Instrumento ins = listaInstrumento.get(x);
	                // verificar cantidad existencia de instrumento
	                while (rs.next()) {
	                    contaInstrumentos++;
	                    if (rs.getInt("iditem") == ins.getIdItem()) {
	                        throw new DAOExcepcion("Instrumento ya asignado");
	                    }
	                }
	                //////////////////////////////////////////////////////////////
	                System.out.println("Instrumentos=" + contaInstrumentos + " capacidad=" + objSala.getCapacidad());
	                if (contaInstrumentos >= objSala.getCapacidad()) {
	                    System.out.println("Capacidad de sala excedida");
	                    throw new DAOExcepcion("Capacidad de sala excedida");
	                }


	                //Insertar en tabla salaitem
	                query = "INSERT INTO salaitem(idsala,iditem) VALUES (?,?)";
	                //con = ConexionBD.obtenerConexion();
	                stmt = con.prepareStatement(query);
	                stmt.setInt(1, objSala.getIdSala());
	                stmt.setInt(2, listaInstrumento.get(x).getIdItem());
	                System.out.println("Armado OK");
	                int i = stmt.executeUpdate();
	                if (i != 1) {
	                    throw new SQLException("No se pudo insertar");
	                }
	            }
	        } catch (SQLException e) {
	            System.err.println(e.getMessage());
	            throw new DAOExcepcion(e.getMessage());
	        } finally {
	            this.cerrarStatement(stmt);
	            this.cerrarConexion(con);
	        }
	        // SERVICIOS !!!!!!!
	        ArrayList<Servicio> listaServicios = (ArrayList<Servicio>) objSala.getServicio();
	        if (listaServicios != null) {
	            for (int x = 0; x < listaServicios.size(); x++) {
	                Servicio ser = listaServicios.get(x);
	                // verificar existencia de servicio
	                try {
	                    rs.first();

	                    while (rs.next()) {
	                        if (rs.getInt("iditem") == ser.getIdItem()) {
	                            throw new DAOExcepcion("Servicio ya asignado");
	                        }
	                    }
	                } catch (SQLException e) {
	                    System.err.println(e.getMessage());
	                    throw new DAOExcepcion(e.getMessage());
	                }
	            }
	        }
	    }
	
	public Collection<Sala> obtenerSalas() throws DAOExcepcion {
			String query = 	"select idsala, sal.descripcion as nombre,direccion ,lc.descripcion as local, capacidad,caracteristicas,costo from sala sal inner join local lc on sal.idlocal = lc.idlocal ";	
			
			Collection<Sala> lista = new ArrayList<Sala>();
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				while (rs.next()) {
					Sala vo = new Sala();
					Local va = new Local();
					vo.setIdSala(rs.getInt("idsala"));
					vo.setDescripcion(rs.getString("nombre"));
					va.setDireccion(rs.getString("direccion"));
					va.setDescripcion(rs.getString("local"));
					vo.setCapacidad(rs.getInt("capacidad"));
					vo.setCaracteristicas(rs.getString("caracteristicas"));
					vo.setCosto(rs.getDouble("costo"));
						
					lista.add(vo);
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return lista;	
		
		
	}
		
	public static Sala buscarSalaPorId(int id) throws DAOExcepcion {
	       // System.out.println("SalaDAO: buscarSalaPorId(String nombre)");

	        String query = "select idsala, sal.descripcion as nombre, direccion ,lc.descripcion as local, capacidad,caracteristicas,costo from sala sal inner join local lc on sal.idlocal = lc.idlocal where sal.idsala = ? ";

	        Sala rpta = new Sala();
	        Connection con = null;
	        PreparedStatement stmt = null;
	        ResultSet rs = null;
	        try {
	            con = ConexionBD.obtenerConexion();
	            stmt = con.prepareStatement(query);
	            stmt.setInt(1, id);
	            rs = stmt.executeQuery();
	            if (rs.next()) {
	                Local va = new Local();
	                rpta.setIdSala(rs.getInt("idsala"));
	                rpta.setDescripcion(rs.getString("nombre"));
	                //rpta.setDireccion(rs.getString("direccion"));
	                rpta.setDescripcion(rs.getString("local"));
	                rpta.setCapacidad(rs.getInt("capacidad"));
	                //System.out.println("capacidaddd=" + rs.getInt("capacidad"));
	                rpta.setCaracteristicas(rs.getString("caracteristicas"));
	                rpta.setCosto(rs.getDouble("costo"));
	                //Agregando Instrumentos y Servicios a la Sala
	                Collection<Instrumento> instrumentos = SalaItemDAO.obtenerInstrumentos(id);
	                Collection<Servicio> servicios = SalaItemDAO.obtenerServicios(id);
	                rpta.setInstrumento(instrumentos);
	                rpta.setServicio(servicios);
	            }
	        } catch (SQLException e) {
	            System.err.println(e.getMessage());
	            throw new DAOExcepcion(e.getMessage());
	        } finally {
	            try {
	                rs.close();
	                stmt.close();
	                con.close();
	            } catch (SQLException ex) {
	                System.out.println(ex.getMessage());
	            }
	        }
	        return rpta;
	    }
		
}

